package com.learning.spring.aop.advisor.advisor.composable;

import com.learning.spring.aop.advisor.service.AopServiceDelegate;
import org.springframework.aop.Pointcut;
import org.springframework.aop.support.ComposablePointcut;
import org.springframework.aop.support.ControlFlowPointcut;
import org.springframework.aop.support.NameMatchMethodPointcut;

/**
 * ClassName: AopComposablePointcut
 * Description: 复合切面- ComposablePointcut、DefaultPointcutAdvisor
 * <p>
 * ComposablePointcut 可以把多个切点以并集或者交集的方式组合起来，提供了切点之间复合运算的功能。
 * Date: 2019/4/21 15:40 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class AopComposablePointcut {

    /**
     * 该方法可以获取复合切面 ComposablePointcut 对象
     *
     * @return
     */
    public Pointcut getPointcut() {
        // 创建复合切点
        // ComposablePointcut 可以把多个切点以并集或者交集的方式组合起来，提供了切点之间复合运算的功能。
        ComposablePointcut pointcut = new ComposablePointcut();

        // 创建流程切点
        Pointcut controlFlowPointcut = new ControlFlowPointcut(AopServiceDelegate.class, "service");

        // 创建一个方法名切点
        NameMatchMethodPointcut nameMatchMethodPointcut = new NameMatchMethodPointcut();
        nameMatchMethodPointcut.setMappedNames("add");

        // 将两个切点交集操作
        return pointcut.intersection(controlFlowPointcut).intersection((Pointcut) nameMatchMethodPointcut);
    }
}